]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
shell-app: Fade the app icon on the left in RTL layouts
authorJasper St. Pierre <jstpierre@mecheye.net>
Fri, 19 Jul 2013 19:39:48 +0000 (15:39 -0400)
committerJasper St. Pierre <jstpierre@mecheye.net>
Mon, 22 Jul 2013 11:09:42 +0000 (07:09 -0400)
The point of fading the icon is to make the text displayed over the
icon more legible. In RTL layouts, the text is displayed on the left
of the icon, so fading the right-hand-side of the icon doesn't work
well.

https://bugzilla.gnome.org/show_bug.cgi?id=704583

js/ui/panel.js
src/shell-app.c
src/shell-app.h

index 1eca2b35224094873dc038eae4e7cd094549d2f3..55c9919299d2b92a15624d6642fabf1ebdb7b395 100644 (file)
@@ -297,13 +297,16 @@ const AppMenuButton = new Lang.Class({
         this._updateIconBoxClip();
     },
 
+    _syncIcon: function() {
+        let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE, this._iconBox.text_direction);
+        this._iconBox.set_child(icon);
+    },
+
     _onIconThemeChanged: function() {
         if (this._iconBox.child == null)
             return;
 
-        this._iconBox.child.destroy();
-        let icon = this._targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
-        this._iconBox.set_child(icon);
+        this._syncIcon();
     },
 
     _updateIconBoxClip: function() {
@@ -526,12 +529,10 @@ const AppMenuButton = new Lang.Class({
         }
 
         this._targetApp = targetApp;
-        let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
-
         this._label.setText(targetApp.get_name());
         this.setName(targetApp.get_name());
 
-        this._iconBox.set_child(icon);
+        this._syncIcon();
         this._iconBox.show();
 
         if (targetApp.get_state() == Shell.AppState.STARTING ||
index 6afa56a34814558e1ce0b081227b5f0136edc4f8..9fa6592466ff34307f0d17d38018043de772a616 100644 (file)
@@ -214,6 +214,7 @@ shell_app_create_icon_texture (ShellApp   *app,
 typedef struct {
   ShellApp *app;
   int size;
+  ClutterTextDirection direction;
 } CreateFadedIconData;
 
 static CoglHandle
@@ -231,7 +232,7 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
   guint8 n_channels;
   gboolean have_alpha;
   gint fade_start;
-  gint fade_range;
+  gint fade_end;
   guint i, j;
   guint pixbuf_byte_size;
   guint8 *orig_pixels;
@@ -283,14 +284,26 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
   pixels = g_malloc0 (rowstride * height);
   memcpy (pixels, orig_pixels, pixbuf_byte_size);
 
-  fade_start = width / 2;
-  fade_range = width - fade_start;
-  for (i = fade_start; i < width; i++)
+  /* fade on the right side for LTR, left side for RTL */
+  if (data->direction == CLUTTER_TEXT_DIRECTION_LTR)
+    {
+      fade_start = width / 2;
+      fade_end = width;
+    }
+  else
+    {
+      fade_start = 0;
+      fade_end = width / 2;
+    }
+
+  for (i = fade_start; i < fade_end; i++)
     {
       for (j = 0; j < height; j++)
         {
           guchar *pixel = &pixels[j * rowstride + i * n_channels];
-          float fade = 1.0 - ((float) i - fade_start) / fade_range;
+          float fade = ((float) i - fade_start) / (fade_end - fade_start);
+          if (data->direction == CLUTTER_TEXT_DIRECTION_LTR)
+            fade = 1.0 - fade;
           pixel[0] = 0.5 + pixel[0] * fade;
           pixel[1] = 0.5 + pixel[1] * fade;
           pixel[2] = 0.5 + pixel[2] * fade;
@@ -316,13 +329,14 @@ shell_app_create_faded_icon_cpu (StTextureCache *cache,
  * shell_app_get_faded_icon:
  * @app: A #ShellApp
  * @size: Size in pixels
+ * @direction: Whether to fade on the left or right
  *
  * Return an actor with a horizontally faded look.
  *
  * Return value: (transfer none): A floating #ClutterActor, or %NULL if no icon
  */
 ClutterActor *
-shell_app_get_faded_icon (ShellApp *app, int size)
+shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction)
 {
   CoglHandle texture;
   ClutterActor *result;
@@ -338,9 +352,13 @@ shell_app_get_faded_icon (ShellApp *app, int size)
 
   /* Use icon: prefix so that we get evicted from the cache on
    * icon theme changes. */
-  cache_key = g_strdup_printf ("icon:%s,size=%d,faded", shell_app_get_id (app), size);
+  cache_key = g_strdup_printf ("icon:%s,size=%d,faded-%s",
+                               shell_app_get_id (app),
+                               size,
+                               direction == CLUTTER_TEXT_DIRECTION_RTL ? "rtl" : "ltr");
   data.app = app;
   data.size = size;
+  data.direction = direction;
   texture = st_texture_cache_load (st_texture_cache_get_default (),
                                    cache_key,
                                    ST_TEXTURE_CACHE_POLICY_FOREVER,
index 3009d8ff75ea931fc7107ba0ab70b45a814487b3..43779143b29168d4beb120d25a8254e0ad0dc671 100644 (file)
@@ -43,7 +43,7 @@ GMenuTreeEntry *shell_app_get_tree_entry (ShellApp *app);
 GDesktopAppInfo *shell_app_get_app_info (ShellApp *app);
 
 ClutterActor *shell_app_create_icon_texture (ShellApp *app, int size);
-ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size);
+ClutterActor *shell_app_get_faded_icon (ShellApp *app, int size, ClutterTextDirection direction);
 const char *shell_app_get_name (ShellApp *app);
 const char *shell_app_get_description (ShellApp *app);
 gboolean shell_app_is_window_backed (ShellApp *app);